package chapter08_class

/**
 * Created with IntelliJ IDEA.
 * ClassName: Test04_ConstructorParam
 * Package: chapter08_class
 * Description:
 * User: fzykd
 *
 * @Author: LQH
 *          Date: 2023-07-02
 *          Time: 20:59
 */

//构造器参数
object Test04_ConstructorParam {
  def main(args: Array[String]): Unit = {
    //没有参数列表 只有通过.方式来赋值
    val student = new Student2
    student.name = "alice"
    student.age = 20
    println(s"student2: name = ${student.name}, age = ${student.age}")

    //局部变量
    val student3 = new Student3("bob",99)
    //无法通过对象获取到属性
    //student3.name
    student3.info()

    //使用var创建参数列表
    val student4 = new Student4("推荐使用",100)
    println(s"student name: ${student4.name}, age: ${student4.age}")

    //val创建参数列表
    val student5 = new Student5("val创建",0)
    //student5.name = "123"  第一次创建赋值之后就不能在更改
    println(s"student5 name: ${student5.name}, age ${student5.age}")

    //
    val student6 = new Student6("主辅构造器同时存在",55,"重庆大学")
    println(s"student6 name: ${student6.name} ,age: ${student6.age}")
    //student6 name: 主辅构造器同时存在 ,age: 55
    //student6: name = 主辅构造器同时存在 , age = 55 ,school = 重庆大学
    student6.info()

  }
}

//主构造器参数参数类型 辅助构造器没有参数类型
//0.没有参数列表的情况
class Student2 {
  //没有定义参数
  var name: String = _
  var age: Int = _
  //主构造器没有定义参数 就要使用辅助构造器进行传值构造

}

//1.没有任何修饰 这个参数就是一个局部变量 类外无法访问
class Student3(name: String, age: Int) {
  def info(): Unit = {
    println(s"name: $name age: $age")
  }
}

//2.var修饰参数,作为类的成员属性使用可以修改 并且又是主构造方法 可以传参和外部访问
class Student4(var name: String, var age: Int)

//3.val修饰 作为类只读属性使用 不能修改 相当于常量
class Student5(val name: String, val age: Int)

//主构造器 和 辅助构造器 存在相同参数的时候
class Student6(var name: String, var age: Int){
  //额外申明变量
  var school:String = _
  def this(name:String,age:Int,school:String){ //辅助构造器 和 主构造器不能相同 相同方法和类型不能构成重载
    this(name,age)
    this.school = school
  }

  def info(): Unit ={
    println(s"student6: name = $name , age = $age ,school = $school")
  }

}


